 //这是一个匿名管道实现：功能：从父进程写入数据，子进程读取数据
 #include<stdio.h>
 #include<unistd.h>
 #include<string.h>
 #include<errno.h>

 int main()
{
        int fd[2];
         //管道需要创建在创建子进程前，这样才能复制
         if(pipe(fd)<0)
         {
                 perror("pipe errno");
                 return -1;
         }
         int pid=-1;
         pid=fork();//创建子进程，对于父进程会返回子进程id，子进程会返回0，创建失败会返回0
         if(pid<0)
         {
                 perror("fork errno");
                 return -1;
         }
      else if(pid==0)
         {
                //子进程 读取数据-> fd[0]
                close(fd[1]);//fd[1]是向管道写入数据，子进程不用写入数据，需要关闭管道写入端
                char buff[1024]={0};
                read(fd[0],buff,1024);//如果管道没数据会等待，然后读取数据，默认阻塞等待直至有数据
                 printf("chlid pid=%d, buff:%s\n",(int)getpid(), buff);
                 close(fd[0]);
         }
         else 
         {
                 //父进程 ：写入数据->fd[1]
                 close(fd[0]); //fd[0]是读取数据，父进程不用读取数据，需要关闭管道读取端，由于父子进程相互独立，关闭一方描述符对另一方无影响
				 printf("parent pid=%d\n", (int)getpid()) ;
                 write(fd[1],"happy day",10);
                 close(fd[1]);
         }
         return 0;
 }
